﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening; // 用于动画效果的库
using UnityEngine.UI; // 用于UI元素的库
using UnityEngine.SceneManagement; // 用于场景管理的库

/// <summary>
///  @brief 视图层脚本，用于处理UI元素的显示和隐藏以及数据更新。
///  该脚本包含了处理游戏菜单、游戏界面、游戏结束界面、设置界面和排名界面的显示和隐藏的逻辑，
///  以及更新分数和排名的功能。
/// </summary>
public class View : MonoBehaviour
{
    /**
     * @brief 控制器类的引用，用于访问游戏逻辑层。
     */
    private Ctrl ctrl;

    /**
     * @brief UI元素的引用。
     */
    private RectTransform logoName;           // 游戏logo
    private RectTransform menuUI;             // 菜单界面
    private RectTransform gameUI;             // 游戏界面
    private GameObject restartButton;         // 重新开始按钮
    private GameObject gameOverUI;            // 游戏结束界面
    private GameObject settingUI;             // 设置界面
    private GameObject rankUI;                // 排名界面

    /**
     * @brief 用于显示分数的Text组件。
     */
    private Text score;                       // 当前分数
    private Text highScore;                   // 最高分数
    private Text gameOverScore;               // 游戏结束时的分数

    /**
     * @brief 静音按钮的引用。
     */
    private GameObject mute;

    /**
     * @brief 排名界面的Text组件。
     */
    private Text rankScore;                   // 当前排名分数
    private Text rankHighScore;               // 最高排名分数
    private Text rankNumbersGame;             // 游戏次数

    /**
     * @brief 初始化函数，获取UI元素和控制器的引用。
     */
    void Awake()
    {
        Debug.Log("[View] Initializing View component...");
        ctrl = GameObject.FindGameObjectWithTag("Ctrl").GetComponent<Ctrl>();

        // 初始化UI元素引用
        logoName = transform.Find("Canvas/LogoName") as RectTransform;
        menuUI = transform.Find("Canvas/MenuUI") as RectTransform;
        gameUI = transform.Find("Canvas/GameUI") as RectTransform;
        restartButton = transform.Find("Canvas/MenuUI/RestartButton").gameObject;
        gameOverUI = transform.Find("Canvas/GameOverUI").gameObject;
        settingUI = transform.Find("Canvas/SettingUI").gameObject;
        rankUI = transform.Find("Canvas/RankUI").gameObject;

        // 初始化分数Text组件引用
        score = transform.Find("Canvas/GameUI/ScoreLabel/Score").GetComponent<Text>();
        highScore = transform.Find("Canvas/GameUI/HighScoreLabel/HighScore").GetComponent<Text>();
        gameOverScore = transform.Find("Canvas/GameOverUI/Score").GetComponent<Text>();

        //// 初始化静音按钮引用
        mute = transform.Find("Canvas/SettingUI/BackGround/AudioButton/Mute").gameObject;

        // 初始化排名界面的Text组件引用
        rankScore = transform.Find("Canvas/RankUI/Record/RecentScoreLabel/RecentScore").GetComponent<Text>();
        rankHighScore = transform.Find("Canvas/RankUI/Record/HighScoreLabel/HighScore").GetComponent<Text>();
        rankNumbersGame = transform.Find("Canvas/RankUI/Record/GameNumberLabel/GameNumber").GetComponent<Text>();
        Debug.Log("[View] View initialization completed");
    }

    /**
     * @brief 显示菜单界面。
     */
    public void ShowMenu()
    {
        Debug.Log("[View] Showing menu UI");
        logoName.gameObject.SetActive(true);
        logoName.DOAnchorPosY(483.14f, 0.5f); // 动画效果：向下移动
        menuUI.gameObject.SetActive(true);
        menuUI.DOAnchorPosY(144.14f, 0.5f); // 动画效果：向上移动
    }

    /**
     * @brief 隐藏菜单界面。
     */
    public void HideMenu()
    {
        Debug.Log("[View] Hiding menu UI");
        logoName.DOAnchorPosY(796.86f, 0.5f).OnComplete(delegate { logoName.gameObject.SetActive(false); }); // 动画结束后隐藏
        menuUI.DOAnchorPosY(-144.14f, 0.5f).OnComplete(delegate { menuUI.gameObject.SetActive(false); }); // 动画结束后隐藏
    }

    /**
     * @brief 更新游戏界面的分数。
     * 
     * @param score 当前分数
     * @param highScore 最高分数
     */
    public void UpdateGameUI(int score, int highScore)
    {
        Debug.Log($"[View] Updating game UI - Score: {score}, High Score: {highScore}");
        this.score.text = score.ToString();
        this.highScore.text = highScore.ToString();
    }

    /**
     * @brief 显示游戏界面。
     * 
     * @param score 当前分数（默认值为0）
     * @param highScore 最高分数（默认值为0）
     */
    public void ShowGameUI(int score = 0, int highScore = 0)
    {
        Debug.Log($"[View] Showing game UI - Score: {score}, High Score: {highScore}");
        this.score.text = score.ToString();
        this.highScore.text = highScore.ToString();
        gameUI.gameObject.SetActive(true);
        gameUI.DOAnchorPosY(472f, 0.5f); // 动画效果：向下移动
    }

    /**
     * @brief 隐藏游戏界面。
     */
    public void HideGameUI()
    {
        Debug.Log("[View] Hiding game UI");
        gameUI.DOAnchorPosY(803f, 0.5f).OnComplete(delegate { gameUI.gameObject.SetActive(false); }); // 动画结束后隐藏
    }

    /**
     * @brief 显示重新开始按钮。
     */
    public void ShowRestartButton()
    {
        Debug.Log("[View] Showing restart button");
        restartButton.SetActive(true);
    }

    /**
     * @brief 显示游戏结束界面。
     * 
     * @param score 游戏结束时的分数（默认值为0）
     */
    public void ShowGameOverUI(int score = 0)
    {
        Debug.Log($"[View] Showing game over UI - Final Score: {score}");
        gameOverUI.SetActive(true);
        gameOverScore.text = score.ToString();
    }

    /**
     * @brief 隐藏游戏结束界面。
     */
    public void HideGameOverUI()
    {
        Debug.Log("[View] Hiding game over UI");
        gameOverUI.SetActive(false);
    }

    /**
     * @brief 响应主页按钮点击事件。
     */
    public void OnHomeButtonClick()
    {
        Debug.Log("[View] Home button clicked");
        ctrl.audioManager.PlayCursor(); // 播放点击音效
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); // 重新加载当前场景
    }

    /**
     * @brief 响应设置按钮点击事件。
     */
    public void OnSettingButtonClick()
    {
        Debug.Log("[View] Setting button clicked");
        ctrl.audioManager.PlayCursor(); // 播放点击音效
        settingUI.SetActive(true); // 显示设置界面
    }

    /**
     * @brief 设置静音按钮的激活状态。
     * 
     * @param isActive 是否激活静音按钮
     */
    public void SetMuteActive(bool isActive)
    {
        Debug.Log($"[View] Setting mute button active: {isActive}");
        mute.SetActive(isActive);
    }

    /**
     * @brief 响应设置界面点击事件。
     */
    public void OnSettingUIClick()
    {
        Debug.Log("[View] Setting UI clicked");
        ctrl.audioManager.PlayCursor(); // 播放点击音效
        settingUI.SetActive(false); // 隐藏设置界面
    }

    /**
     * @brief 显示排名界面，并更新分数和游戏次数。
     * 
     * @param score 当前分数
     * @param highScore 最高分数
     * @param numbersGame 游戏次数
     */
    public void ShowRankUI(int score, int highScore, int numbersGame)
    {
        Debug.Log($"[View] Showing rank UI - Score: {score}, High Score: {highScore}, Games Played: {numbersGame}");
        this.rankScore.text = score.ToString();
        this.rankHighScore.text = highScore.ToString();
        this.rankNumbersGame.text = numbersGame.ToString();
        rankUI.SetActive(true); // 显示排名界面
    }

    /**
     * @brief 响应排名界面点击事件。
     */
    public void OnRankUIClick()
    {
        Debug.Log("[View] Rank UI clicked");
        rankUI.SetActive(false); // 隐藏排名界面
    }
}